템플릿화한 HTML 문서와 Javascript 실행 문제

✒️ 2025-05-23 15:32 내용 수정


프로젝트와 문서 구조

root/
├── html/
│   ├── index.html
│   └── topheader.html
├── js/
│   └── topheader/
│       └── topheader.js

template_html_js_problem 1.png
template_html_js_problem 5.png


공통 문제 상황

template_html_js_problem 2.png


문제 1

template_html_js_problem 4.png

문제 1의 원인과 해결 방법

문제와 연관된 항목들 참고 자료 : 웹 브라우저의 동작#3. 구문 분석(Parsing), JavaScript#defer와 async 속성, DOMContentLoaded

// side nav의 버튼 동작을 제어
document.addEventListener("DOMContentLoaded", function () {
    // nav 요소가 로딩될 때까지 탐색 
    const interval = setInterval(() => {
        console.log('nav 요소 탐색중..')
        
        // 이벤트를 넣을 대상 요소 선택
        const sidebar = document.querySelector("#side-bar");
        const toggleButton = document.querySelector("#side-button");

        console.log(sidebar, toggleButton);
        
        // 요소가 있을 때 이벤트 추가
        if (sidebar && toggleButton) {
            toggleButton.addEventListener("click", function () {
                sidebar.classList.toggle("active");
            });
            clearInterval(interval); // 이벤트 연결 후 멈춤
        }
    }, 100);
});
const observer = new MutationObserver(() => {
	const sidebar = document.querySelector("#side-nav-bar");
	const toggleButton = document.getElementById("SideButton");
	
	if (sidebar && toggleButton) {
		toggleButton.addEventListener("click", function () {
			sidebar.classList.toggle("active");
		});
		
		observer.disconnect(); // 감지 중지
	}
});

observer.observe(document.body, { childList: true, subtree: true });
document.addEventListener("DOMContentLoaded", function () {
    // 템플릿 문서 가져오기
    fetch("./topheader.html")
        .then(response => response.text())
        .then(html => {
            // HTML을 삽입
            const topHeader = document.getElementById("top-header");
            topHeader.innerHTML = html;

	        // 이벤트를 넣을 대상 요소 선택
	        const sidebar = document.querySelector("#side-bar");
	        const toggleButton = document.querySelector("#side-button");

	        // 요소가 있을 때 이벤트 추가
			toggleButton.addEventListener("click", function () {
				sidebar.classList.toggle("active");
			});
        })
        .catch(error => console.error("topheader 로드 실패:", error));
});


문제 2

template_html_js_problem 3.png

문제 2의 원인과 해결 방법